/**************************************************************************//**
 * @item     CosyOS-III Demo
 * @file     demo_main.c
 * @brief    例程-主函数 for Cortex-M
 * @author   迟凯峰
 * @version  V1.0.1
 * @date     2025.06.07
 ******************************************************************************/

#if 0 // 编译开关

#include "CosyOS.H" // 用户的各个c文件中应包含此文件
#include <stdio.h> // for printf

int main(void)
{
    /* USER INIT CODE BEGIN */
    // firmware library standard peripheric Drivers
    #if   (defined ( USE_STDPERIPH_DRIVER ))
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    USART1_UART_Init(115200);
    USART1_DMA_Init();
    
    // STM32CubeMX generate code with HAL Drivers
    #elif (defined ( USE_HAL_DRIVER ))
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();
    MX_DMA_Init();
    #endif
    /* USER INIT CODE END */
    
    /* USER INIT SysTick替代定时器 */// 当系统中断配置为 TIMn_IRQHandler + XXXx_IRQHandler
    #if MCUCFG_SYSINT == 0
    if(1){
        static void TIM14_Init(void);
        TIM14_Init();
    }// SysTick替代定时器 选定为 TIM14。
    #endif
    
    /* USER DEBUG CONFIG */// for CosyOS-Taskmgr
    #if SYSCFG_DEBUGGING == 1
    if(1){
        void Debug_Config(void);
        Debug_Config();
    }// defined in demo_debug_fwl.c and demo_debug_hal.c
    #endif
    
    /* USER 启动 CosyOS */// 在main函数的末尾处
    if(1){
        #if 1 // 建议前期调试时开启，如果CosyOS启动失败会返回错误码提示用户！
        unsigned char _ecode = uStartCosyOS();
        printf("CosyOS startup failed, error code: %d.\r\n", (int)_ecode);
        #else
        uStartCosyOS();
        #endif
    }
    while(1);
}


/**
  * \brief  SysTick替代定时器初始化
  * \note   在 mcucfg_cmx.h 中，系统中断配置为 TIMn_IRQHandler + XXXx_IRQHandler。
  * \note   在 mcucfg_cm0.h 中，SysTick替代中断 配置为 TIM14_IRQHandler，<br>
            也就是说，SysTick替代定时器 选定为 TIM14。
  * \note   用户可在main函数中调用 TIM14_Init 来初始化 TIM14。
  */
#if MCUCFG_SYSINT == 0
static void TIM14_Init(void)
{
    RCC->APB1ENR |= RCC_APB1ENR_TIM14EN;   // 定时器时钟使能
    TIM14->PSC = 48 / 1 * 1 - 1;           // 预分频
    TIM14->ARR = SYSCFG_SYSTICK_CYCLE - 1; // 重装载值
    TIM14->CR1 = (1 << 0) | (1 << 2);      // 使能计数器 | 只有上溢/下溢会生成更新中断 | 计数方向任意
    TIM14->DIER = 1;                       // 使能更新中断
}
#endif


#endif
